X-Git-Url: https://git.r.bdr.sh/rbdr/super-polarity/blobdiff_plain/8534e46e400268c5ceffb3b14f02cef39eedae8f..3de51c6f55d304f038df1b77c8ab346e2a187fe1:/Super%20Polarity/Actors/Actor.cs diff --git a/Super Polarity/Actors/Actor.cs b/Super Polarity/Actors/Actor.cs new file mode 100644 index 0000000..3bb06be --- /dev/null +++ b/Super Polarity/Actors/Actor.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; + +namespace SuperPolarity +{ + class Actor + { + protected SuperPolarity game; + + public List Children; + + // Graphics / In-Game + protected Texture2D Texture; + protected Vector2 Origin; + public bool Active; + public Rectangle Box; + public Vector4 BoxDimensions; + protected Texture2D BoxTexture; + + // Physical Properties + public Vector2 Position; + protected Vector2 Velocity; + protected Vector2 Acceleration; + public float Angle; + + // Constraints / Behavior + public float MaxVelocity; + protected float AccelerationRate; + public int HP; + protected bool Immortal; + public bool Dying; + public int Value; + protected Color Color; + + public Actor Parent; + + public int Width + { + get { return Texture.Width; } + } + + public int Height + { + get { return Texture.Height; } + } + + public Actor(SuperPolarity newGame) + { + game = newGame; + BoxDimensions.X = 20; + BoxDimensions.Y = 20; + BoxDimensions.W = 15; + BoxDimensions.Z = 15; + } + + public virtual void Initialize(Texture2D texture, Vector2 position) + { + Texture = texture; + Position = position; + Active = true; + + Children = new List(); + + Origin = new Vector2(Texture.Width / 2, Texture.Height / 2); + Velocity = new Vector2(0, 0); + Acceleration = new Vector2(0, 0); + + MaxVelocity = 5; + AccelerationRate = 10; + + HP = 1; + Immortal = false; + + Dying = false; + Value = 1; + + InitBox(); + BoxTexture = new Texture2D(game.GraphicsDevice, 1, 1); + BoxTexture.SetData(new Color[] { Color.White }); + + Color = Color.White; + } + + protected void InitBox() + { + Box = new Rectangle((int)(Position.X - BoxDimensions.X), (int)(Position.Y - BoxDimensions.X), (int)(BoxDimensions.X + BoxDimensions.X + BoxDimensions.W), (int)(BoxDimensions.Y + BoxDimensions.Y + BoxDimensions.Z)); + } + + public void AutoDeccelerate(GameTime gameTime) + { + if (Acceleration.X == 0 && Velocity.X > 0) + { + if (AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds > Velocity.X) + { + Velocity.X = 0; + Acceleration.X = 0; + } + else + { + Acceleration.X = -AccelerationRate; + } + } + + if (Acceleration.X == 0 && Velocity.X < 0) + { + if (-AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds < Velocity.X) + { + Velocity.X = 0; + Acceleration.X = 0; + } + else + { + Acceleration.X = AccelerationRate; + } + } + + if (Acceleration.Y == 0 && Velocity.Y > 0) + { + if (AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds > Velocity.Y) + { + Velocity.Y = 0; + Acceleration.Y = 0; + } + else + { + Acceleration.Y = -AccelerationRate; + } + } + + if (Acceleration.Y == 0 && Velocity.Y < 0) + { + if (-AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds < Velocity.Y) + { + Velocity.Y = 0; + Acceleration.Y = 0; + } + else + { + Acceleration.Y = AccelerationRate; + } + } + } + + public virtual void Update(GameTime gameTime) + { + Move(gameTime); + ChangeAngle(); + CheckOutliers(); + UpdateBox(); + } + + protected virtual void UpdateBox() + { + Box.X = (int)(Position.X - BoxDimensions.X); + Box.Y = (int)(Position.Y - BoxDimensions.Y); + } + + public virtual void Move(GameTime gameTime) + { + AutoDeccelerate(gameTime); + + var maxVelocity = MaxVelocity; + + Velocity.X = Velocity.X + Acceleration.X * (float)gameTime.ElapsedGameTime.TotalSeconds; + Velocity.Y = Velocity.Y + Acceleration.Y * (float)gameTime.ElapsedGameTime.TotalSeconds; + + if (Velocity.X > MaxVelocity) + { + Velocity.X = MaxVelocity; + } + + if (Velocity.X < -MaxVelocity) + { + Velocity.X = -MaxVelocity; + } + + if (Velocity.Y > MaxVelocity) + { + Velocity.Y = MaxVelocity; + } + + if (Velocity.Y < -MaxVelocity) + { + Velocity.Y = -MaxVelocity; + } + + Position.X = Position.X + Velocity.X; + Position.Y = Position.Y + Velocity.Y; + } + + public void ChangeAngle() + { + if (Math.Abs(Velocity.Y) <= 0.1 && Math.Abs(Velocity.X) <= 0.1) + { + return; + } + Angle = (float)Math.Atan2(Velocity.Y, Velocity.X); + } + + public virtual void Draw(SpriteBatch spriteBatch) + { + Actor child = null; + + // TODO: Check what's up with the null children. + if (Children == null) + { + return; + } + for (var i = Children.Count - 1; i >= 0; i--) + { + child = Children[i]; + child.Draw(spriteBatch); + } + + spriteBatch.Draw(Texture, Position, null, Color, Angle, Origin, 1f, SpriteEffects.None, 0f); + //spriteBatch.Draw(BoxTexture, Box, new Color(255, 0, 255, 25)); + } + + void CheckOutliers() + { + for (var i = Children.Count; i > 0; i--) + { + var actor = Children[i - 1]; + if (actor.Position.X < -SuperPolarity.OutlierBounds || actor.Position.Y < -SuperPolarity.OutlierBounds || + actor.Position.X > game.GraphicsDevice.Viewport.Width + SuperPolarity.OutlierBounds || + actor.Position.Y > game.GraphicsDevice.Viewport.Height + SuperPolarity.OutlierBounds) + { + Children.Remove(actor); + } + } + } + + public virtual void Collide(Actor other, Rectangle collision) + { + } + + public void TakeDamage(int amount) + { + if (!Immortal) + { + HP = HP - amount; + if (HP < 0) + { + Die(); + } + } + } + + protected virtual void Die() + { + Dying = true; + } + + public virtual void CleanUp() + { + Texture = null; + BoxTexture = null; + Children = null; + Texture = null; + } + } +}